import socket

# 实现一个本地的 客户端和服务的即时聊天

# 1.创建一个服务端的socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2.bind 绑定
# IP:192.168.0.66，其他主机可以和当前的服务端通信
# IP:127.0.0.1，其他主机不可以和当前的服务端通信 ，除非客户端也在本地
# IP:'' , 该服务端绑定到所有的IP地址上。
# server_socket.bind(('192.168.0.66', 6666))
server_socket.bind(('', 6666))

while True:
    print('开始阻塞')
    # 3.接收客户端数据 recvfrom() 这个函数1024意思是 一次接收 1024个字节，
    # msg 是接收的数据,是字节数组
    # addr 是客户端的ip和端口 是元组结构传输过来的
    # msg
    msg, addr = server_socket.recvfrom(1024)
    # 如果接收到客户端的exit指令，服务端也关闭socket
    if msg.decode('utf-8') == 'exit':
        break
    print(f'接收来自客户端IP：{addr[0]} 端口：{addr[1]} 的消息，msg：{msg.decode('utf-8')}')

    # 4.服务端给客户端回消息.
    # decode('utf-8') 把字节数据转化成字符串
    # encode('utf-8') 把字符串转化成字节数据
    server_msg = input('服务端>>>')
    # sendto发送的数据不能是字符串，只能是字节数据, 字符串的encode函数
    server_socket.sendto(server_msg.encode('utf-8'), addr)

# 最后要关闭socket
server_socket.close()
